package com.asa.c;


/**
 * 性能调优
 * @author Administrator
 *
 */
public class A {
	
	
	/**
	 * 
	 * 	调优工具
	 * jconsole
	 * 		直接在cmd中打印jconsole即可，调用java自带的包
	 * 
	 * jvisaulvm
	 * 		直接在cmd中打印jvisaulvm即可，调用java自带的包
	 * 
	 * 
	 * JHSDB		jkd9开始有
	 * 		
	 * 
	 * 
	 * 
	 * jmap -dunp:format=b, live,f ile=test1.bin 14036		文件生成
	 * 
	 * 
	 */
	
	
	
	/**
	 * index
	 * 
	 * 
	 * 
	 * 		02-jps	直接查看当前运行的java程序
			03-jstat:查看JVM统计信息
			04- jinfo:实时查看和修改JVM配置参数
			05 jmap:导出内存映像文件&内存使用情况
			06-jhat: JDK自带堆分析工具
			07 jtack:打印JVM中线程快照
			08 jcmd:多功能命令行
			09-jstatd:远程主机信息收集
	 * 
	 * 
	 */
	
	
	
	
	
	
	
	/** 
	 * jps
	 * 
	 * jps	直接查看当前运行的java程序
	 * 
	 *  jps [options] [hostid] 
	 * 
	 * 
	 * 
	 * 
	 * options参数
			-q :仅仅显示LVMID (local virtual machine id)， 即本地虚拟机唯一id。 不
			显示主类的名称等
			-l: 输出应用程序主类的全类名或如果进程执行的是jar包，则输出jar完整路径
			-m:
			输出虚拟机进程启动时传递给主类main()的参数
			-V :
			列出虚拟机进程启动时的JVM参数。比如:-Xms20m-Xmx50m是启动程序指定
			的jvm参数。
			说明:以上参数可以综合使用。
			补充:
			如果某Java进程关闭了默认开启的UsePerfData参数(即使用参数
			-XX: -UsePerfData)，那么jps命令 (以及下面介绍的jstat)将无法探知该
			Java 进程。

	 * 
	 * 
	 * jps -m >a.txt		把打印输出到文件中
	 * 
	 * 
	 * 
	 * hostid主机id
	 * 远程连接需要安装jstatd
	 * 但远程连接不流行，可能有ip攻击问题
	 * 
	 */
	
	
	
	
	/**
	 * 
	 * jstat	查看jvm统计信息
	 * jstat -<option>[-t] [-h<lines>] <vmid>[<interval>[<count>]]

	 * 
	 * 
	 * jstat (JVM Statistics Monitoring Tool):用于监视虚拟机各种运行状态信息
		的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、
		JIT编译等运行数据。
		在没有GUI图形界面，只提供了纯文本控制台环境的服务器上，它将是运行期定位虚
		拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。

	 * 
	 * 
	 * jstat -class 9000	查看加载了多少个类
	 * 
	 * option参数
				选项option可以由以下值构成。
				,类装载相关的:
				●-class: 显示ClassLoader的相关信息: 类的装载、卸载数量、总空间、
				类装载所消耗的时间等
				垃圾回收相关的:
				-gc:显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、
				永久代等的容量、己用空间、GC时间合计等信息。
				-gccapacity:显示内容与-gc基本相同，但输出主要关注Java堆各个区域
				使用到的最大、最小空间。
				●-gcutil: 显示内容与-gc基本相同，但输出主要关注已使用空间占总空间
				的百分比。
				●- gccause:
				与-gcuti1功能一样，但是会额外输出导致最后一次或当前正
				在发生的GC产生的原因。
				●-gcnew: 显示新生代GC状况
				●-gcnewcapacity: 显示内容与-gcnew基本相同，输出主要关注使用到的
				最大、最小空间
				●-geold: 显示老年代GC状况
				●-gcoldcapacity: 显示内容与-gcold基本相同，输出主要关注使用到的
				最大、最小空间
				●-gcpermcapacity:显示永久代使用到的最大、最小空间。
				
			●JIT相关的:
				-compiler:显示JIT编译 器编译过的方法、耗时等信息
				-printcompilation: 输出已经被JIT编译的方法


	 * 
	 * 
	 * interval		参数用于指定输出统计数据的周期，单位为毫秒。即:查询间隔
	 * 
	 * count参数			用于指定查询的总次数
	 * 
	 * -t 打印的间隔时间
	 * 经验
			我们可以比较Java进程的启动时间以及总GC时间(GCT列)，或者两次测量的间隔时间
			以及总GC时间的增量，来得出GC时间占运行时间的比例。
			如果该比例超过20%，则说明目前堆的压力较大;如果该比例超过90%，则说明堆里几乎没有
			可用空间，随时都可能抛出00M异常。

	 * 
	 * 
	 * 
	 * 
	 * -h参数		可以在周期性数据输出时，输出多少行数据后输出一一个表头信息
	 * 
	 * 
	 * 
	 * 
	 * 
	 * jstat -printcompilation 9000		输出已经被JIT编译的方法
	 * 
	 * 
	 * jstat -gc 9000 1000 10		查看GC
	 * 
	 *  jstat -gc -t 9000 1000 10		查看GC,时间间隔
	 * 		GCT是GC的时间
	 * 		SOC可以计算时间间隔
	 * 		这样就可以计算GC所花费的运行时间占比
	 * 
	 * 		jstat还可以用来判断是否出现内存泄漏。
			第1步:
			在长时间运行的Java程序中，我们可以运行jstat命令连续获取多行性能数据，并取这几行
			数据中0l列(即已占用的老年代内存)的最小值。
			第2步:
			然后，我们每隔一段较长的时间重复一-次上述操作，来获得多组ou最小值。如果这些值呈上
			涨趋势，则说明该Java程序的老年代内存已使用量在不断上涨，这意味着无法回收的对象在
			不断增加，因此很有可能存在内存泄漏。

	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 */
	
	
	
	/**
	 * 
	 * jinfo
	 * 
	 * 
	 * jinfo(Configuration Info for Java)
			查看虚拟机配置参数信息，也可用于调整虚拟机的配置参数。
			在很多情况下，Java应用程序不会指定所有的Java虚拟机参数。而此时，开发人员可能不知道
			某一个具体的Java虚拟机参数的默认值。在这种情况下，可能需要通过查找文档获取某个参数
			的默认值。这个查找过程可能是非常艰难的。但有了jinfo工具，开发人员可以很方便地找到
			Java虚拟机参数的当前值。

	 * 
	 * 
	 * 它的基本使用语法为:
		jinfo [ options ] pid
		说明: java进程ID必须要加上
		[ options ]:
		选项
		选项说明
		no option
		输出全部的参数和系统属性
		-flag name
		输出对应名称的参数
		-flag [+-]name
		开启或者关闭对应名称的参数只有被标记为manageable的参数才可以被动态修改
		-flag name=value
		设定对应名称的参数
		-flags
		输出全部的参数
		-sysprops
		输出系统属性

	 * 
	 * 
	 * 
	 * 
	 * jinfo不仅可以查看运行时某-个Java虚拟机参数的实际取值，甚至可以在运行时修改部分参
			数，并使之立即生效。
			但是，并非所有参数都支持动态修改。参数只有被标记为manageable的f]2g可以被实时修改
			。其实，这个修改能力是极其有限的。
			#可以查看 被标记为manageable的参数
			java -XX:+PrintFlagsFinal -version| grep manageable

	 * 
	 * 
	 *  jinfo -flag UseParal1e1GC 3540 		查看这个参数的情况
	 * 
	 * 
	 *  jinfo -flag +UseParal1e1GC  3540	修改参数
	 * 
	 * java -XX:+ PrintFlasInitial >1.txt
		查看所有JVM参数启动的初始值
		java .XX: + PrintFlagsFinal
		查看所有JVM参数的最终值
		java -XX:+ PrintCommandLineFlags
		查看 那些已经被用户或者JVM设置过的详细的XX参数的名称和值

	 * 
	 * 
	 * 
	 */
	
	
	
	
	
	/**
	 * 
	 * 
	 * jmap		主要用来导出内存映像文件和内存使用情况
	 * 
	 * 
	 * jmap(JVM Memory Map): 作用一方面是获取dump文件(堆转储快照文件，二进制文件)，
			它还可以获取目标Java进程的内存相关信息，包括Java堆 各区域的使用情况、堆中对象的统
			计信息、类加载信息等。
			开发人员可以在控制台中输入命令“jmap -help" 查阅jmap工具的具体使用方式和一些标准
			选项配置。
			官方帮助文档:
			https://docs.oracle.com/en/java/javase/11/tools/jmap.html

	 * 
	 * 
	 * 
	 * 
	 * 
	 * jmap -dump 	生成快照文件
	 * jmap -dump:live	只保存堆中的存活对象
	 * 手动的方式，
	  		jmap -dump:format=b,file= <filename.hprof> <pid>
			jmap -dump:live,format=b,file= <filename.hprof> <pid>

	 * 自动的方式团
	 		-XX:+HeapDumpOnOutOfMemoryError			OOM退出系统时
			-XX:HeapDumpPath= <filename.hprof>

	 * 
	 * 
	 * 
	 * jmap -heap	输出堆中间的详细信息
	 * 
	 * jmap -histo	输出对象的统计信息，包括类、实例数量和合计容量
	 * jmap -histo:live
	 * 
	 * 
	 * jmap -permstat 以ClassLoader为统计口径输出永久代的内存状态信息（这个指令仅仅linux和solaris平台有效）
	 * 
	 * jmap -finalizerinto
	 * 显示在F-Queue中等待Finalizer线程执行finalize方法的对象（仅linux/solaris平台有效）
	 * 
	 * jmap -F
	 * 当虚拟机进程对dump选项没有任何响应时，可使用此选项强制执行生成dump文件（仅linux/solaris平台有效）
	 * 
	 * jmap -h |-help
			jmap工具使用的帮助命令

	 * 
	 * 
	 * jmap -J
			传递参数给jmap启动的jvm

	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 使用1:导出内存映像文件
			-般来说，使用jmap指令生成dump文件的操作算得上是最常用的jmap命令之一，将堆中所有
			存活对象导出至一个文件之中。
			Heap Dump 又叫做堆存储文件，指一个Java进程在某个时间点的内存快照。Heap Dump在触
			发内存快照的时候会保存此刻的信息如下:
			, All ObjectfIs
			Class, fields, primitive values and references
			●All Classes
			ClassLoader, name, super class,static fields
			●Garbage Collection Roots
			Objects defined to be reachable by the JVM
			Thread Stacks and Local Variables
			The call-stacks of threads at the moment of the snapshot ，and per- frame
			information about local objects
			说明:
			1.通常在写HeapDump文件前会触发一次Fu1lGC，所以heapdump文件里保存的都是
			Ful1GC后留下的对象信息。
			2，生产dump是耗时操作
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 由于jmap将访问堆中的所有对象，为了保证在此过程中不被应用线程干扰，jmap需 要借助安
		全点机制，让所有线程停留在不改变堆中数据的状态。也就是说，由jmap导出的堆快照必定
		是安全点位置的。这可能导致基于该堆快照的分析结果存在偏差。
		举个例子，假设在编译生成的机器码中，某些对象的生命周期在两个安全点之间，那么
		:live选项将无法探知到这些对象。
		另外，如果某个线程长时间无法跑到安全点，jmap将一 直等下 去。
		与前面讲的jstat则不同，垃圾回收器会主动将jstat所需要的摘要数据保存至固定位置之中
		，而jstat只需直接读取即可。

	 * 
	 * 
	 * 
	 * 
	 * 
	 */
	
	
	
	
	/**
	 * 
	 * jhat(JVM Heap Analysis Tool):
			Sun JDK提 供的jhat命令与jmap命令搭配使用，用于分析jmap生成的heap dump文件(堆转
			储快照)。jhat内置了一个微型的HTTP/HTML服务器，生成dump文件的分析结果后， 用户
			可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。
			使用了jhat命令，就启动了一个http服务，端口是7000，即http://localhost:7000/,
			就可以在浏览器里分析。
			说明: jhat 命令在JDK9、JDK10中 已经被删除，官方建议用VisualVM代替。

	 * 
	 * 
	 * 
	 * 
	 * jhat d:/d.hprof		分析文件，这个文件是生成的jmap
	 * 
	 * 
	 * OQL
	 * 	select s from java.lang.String s where s.values.lenght >100
	 * 
	 * 
	 * 
	 * 
	 * 
	 * option参数: -stack faseltrue
		关闭|打开对象分配调用栈跟踪
		option参数: -refs falsetrue
		关闭 |打开对象引用跟踪 。
		设置jhat HTTP
		option参数: port port number
		Server的端口号，默认7000
		option参数: -exclude exclude-file
		执行对象查询时需要排除的数据成员
		option参数: -baseline exclude-file
		指定一个基准堆转储
		option参数: -debug int
		设置debug级别
		option参数: -version
		启动后显示版本信息就退出
		option参数:-j<flag>
		传入启动参数， 比如一-Xmx512m

	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 */
	
	
	
	/**
	 * 
	 * 
	 * 
	 * jstack(JVM Stack Trace):用于生成虛拟机指定进程当前时刻的线程快照(虚拟机堆栈跟
			踪)。线程快照就是当前虚拟机内指定进程的每--条线程正在执行的方法堆栈的集合。
			生成线程快照的作用:可用于定位线程出现长时间停顿的原因，如线程间死锁、死循环、请求
			外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停
			顿时，就可以用jstack显示各个线程调用的堆栈情况。
			官方帮助文档:
			https://docs.oracle.com/en/java/javase/11/tools/jstack.html
			在thread dump中， 要留意下面几种状态
			死锁，Deadlock (重点关注)
			等待资源，Waiting on condition (重点关注)
			等待获取监视器，Waiting on monitor entry (重点关注)
			阻塞，Blocked (重点关注)
			●执行中，Runnable
			●暂停，Suspended
	 * 
	 * 
	 * 
	 * jstack [pid]
	 * 
	 * 
	 * 
	 * 
	 * option参数
			-F 当正常输出的请求不被响应时，强制输出线程堆栈
			option参数:-l
			除堆栈外， 显示关于锁的附加信息
			option参数: -m
			如果调用到本地方法的话，可以显示C/C+ +的堆栈
			option参数: -h
			 帮助操作

	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 */
	
	

	/**
	 * jcmd。
	 * 
	 * 在JDK 1.7以后，新增了一个命令行工具jcmd。
			它是一个多功能的工具，可以用来实现前面除了jstat之外所有命令的功能。比如:用它来导
			出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运 行时间等。
			官方帮助文档:
			https://docs . oracle. com/ en/java/javase/ 11/tools/jcmd . html
			jcmd拥有jmap的大部分功能，并且在Oracle的官方网站上也推荐使用jcmd命令代jmap命令
	 * 
	 * 
	 * 
	 * jcmd -l	列出所有的N|进程
		jcmd pid help	针对指定的进程，列出支持的所有命令
		jcmd pid具体命令口	显示指定进程的指令命令的数据

	 * 
	 * jcmd 8320 GC.heap_dump d:/6.hprof
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 */
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

}
